package org.agile4j.math.induction;

/**
 * 数学归纳法
 */
public class MathInductionDemo {

    /**
     * 使用函数的递归调用，进行数学归纳法的证明
     *
     * @param k      放到第几格
     * @param result 保持当前各麦数，和麦粒总数
     * @return 放到第k格时 是否成立
     */
    public static boolean prove(int k, Result result) {
        // 证明 n=1 时，是否成立
//        System.out.println(k);
        if (k == 1) {
            if (Math.pow(2, 1) - 1 == 1) {
                result.wheatNum = 1;
                result.wheatTotalNum = 1;
                return true;
            } else {
                return false;
            }
        }
        // 如果 n = k-1 时命题成立，证明 n=k 时命题是否成立
        else {
            boolean proveOfPreFlag = prove(k - 1, result);
            result.wheatNum = result.wheatNum * 2;
            result.wheatTotalNum = result.wheatTotalNum + result.wheatNum;
            boolean proveOfCurrFlag = false;
            if (result.wheatTotalNum == (Math.pow(2, k) - 1)) {
                proveOfCurrFlag = true;
            }

            if (proveOfCurrFlag && proveOfPreFlag) {
                return true;
            } else {
                return false;
            }
        }
    }

    public static void main(String[] args) {
        int grid = 63;
        Result result = new Result();
        System.out.println(MathInductionDemo.prove(grid, result));
    }
}

class Result {
    /**
     * 当前麦数量
     */
    public long wheatNum = 0;

    /**
     * 目前为止麦总数
     */
    public long wheatTotalNum = 0;
}